module wallace_tree(
    logic [7:0]  a, 
    logic [7:0]  b, 
    logic [15:0] z
);

logic [7:0] p [7:0];

always @(*) begin
    interger i, j
    for (i = 0; i < 8; i = i + 1)
        for (j = 0; j < 8; j = j + 1)
            p[i][j] = a[i] & j[j];
end

assign z[0] = p[0][0];

parameter zero = 1'b0;
wire [2:0] s1[44:1];
wire [2:0] c1[45:2];
// module add1 (a,b,ci, c, c0);

//===============================level 1===============================
//index 46: p[23][23]
//index 45: p[23][22],p[22][23]
add1 fa1_44_0 (p[23][21], p[22][22], p[21][23], s1[44][0], c1[45][0]);
add1 fa1_43_0 (p[23][20], p[22][21], p[21][22], s1[43][0], c1[44][0]);
//index 43: p[20][23]
add1 fa1_42_1 (p[23][19], p[22][20], p[21][21], s1[42][1], c1[43][1]);
add1 fa1_42_0 (p[20][22], p[19][23], zero     , s1[42][0], c1[43][0]);
//index 42: p[20][22],p[19][23]
add1 fa1_41_1 (p[23][18], p[22][19], p[21][20], s1[41][1], c1[42][1]);
add1 fa1_41_0 (p[20][21], p[19][22], p[18][23], s1[41][0], c1[42][0]);
add1 fa1_40_1 (p[23][17], p[22][18], p[21][19], s1[40][1], c1[41][1]);
add1 fa1_40_0 (p[20][20], p[19][21], p[18][22], s1[40][0], c1[41][0]);
//index 40: p[17][23]
add1 fa1_39_2 (p[23][16], p[22][17], p[21][18], s1[39][2], c1[40][2]);
add1 fa1_39_1 (p[20][19], p[19][20], p[18][21], s1[39][1], c1[40][1]);
add1 fa1_39_0 (p[17][22], p[16][23], zero     , s1[39][0], c1[40][0]);
add1 fa1_38_2 (p[23][15], p[22][16], p[21][17], s1[38][2], c1[39][2]);
add1 fa1_38_1 (p[20][18], p[19][19], p[18][20], s1[38][1], c1[39][1]);
add1 fa1_38_0 (p[17][21], p[16][22], p[15][23], s1[38][0], c1[39][0]);
add1 fa1_37_2 (p[23][14], p[22][15], p[21][16], s1[37][2], c1[38][2]);
add1 fa1_37_1 (p[20][17], p[19][18], p[18][19], s1[37][1], c1[38][1]);
add1 fa1_37_0 (p[17][20], p[16][21], p[15][22], s1[37][0], c1[38][0]);
//index 37: p[14][23]
add1 fa1_36_3 (p[23][13], p[22][14], p[21][15], s1[36][3], c1[37][3]);
add1 fa1_36_2 (p[20][16], p[19][17], p[18][18], s1[36][2], c1[37][2]);
add1 fa1_36_1 (p[17][19], p[16][20], p[15][21], s1[36][1], c1[37][1]);
add1 fa1_36_0 (p[14][22], p[13][23], zero     , s1[36][0], c1[37][0]);

add1 fa1_35_3 (p[23][12], p[22][13], p[21][14], s1[35][3], c1[36][3]);
add1 fa1_35_2 (p[20][15], p[19][16], p[18][17], s1[35][2], c1[36][2]);
add1 fa1_35_1 (p[17][18], p[16][19], p[15][20], s1[35][1], c1[36][1]);
add1 fa1_35_0 (p[14][21], p[13][22], p[12][23], s1[35][0], c1[36][0]);

add1 fa1_34_3 (p[23][11], p[22][22], p[21][13], s1[34][3], c1[35][3]);
add1 fa1_34_2 (p[20][14], p[19][15], p[18][16], s1[34][2], c1[35][2]);
add1 fa1_34_1 (p[17][17], p[16][18], p[15][19], s1[34][1], c1[35][1]);
add1 fa1_34_0 (p[14][20], p[13][21], p[12][22], s1[34][0], c1[35][0]);
//index 34: p[11][23]

add1 fa1_33_4 (p[23][10], p[22][11], p[21][12], s1[33][4], c1[34][4]);
add1 fa1_33_3 (p[20][13], p[19][14], p[18][15], s1[33][3], c1[34][3]);
add1 fa1_33_2 (p[17][16], p[16][17], p[15][18], s1[33][2], c1[34][2]);
add1 fa1_33_1 (p[14][19], p[13][20], p[12][21], s1[33][1], c1[34][1]);
add1 fa1_33_0 (p[11][22], p[10][23], zero     , s1[33][0], c1[34][0]);

add1 fa1_32_4 (p[23][09], p[22][10], p[21][11], s1[32][4], c1[33][4]);
add1 fa1_32_3 (p[20][12], p[19][13], p[18][14], s1[32][3], c1[33][3]);
add1 fa1_32_2 (p[17][15], p[16][16], p[15][17], s1[32][2], c1[33][2]);
add1 fa1_32_1 (p[14][18], p[13][19], p[12][20], s1[32][1], c1[33][1]);
add1 fa1_32_0 (p[11][21], p[10][22], p[09][23], s1[32][0], c1[33][0]);

add1 fa1_31_4 (p[23][08], p[22][09], p[21][10], s1[31][4], c1[32][4]);
add1 fa1_31_3 (p[20][11], p[19][12], p[18][13], s1[31][3], c1[32][3]);
add1 fa1_31_2 (p[17][14], p[16][15], p[15][16], s1[31][2], c1[32][2]);
add1 fa1_31_1 (p[14][17], p[13][18], p[12][19], s1[31][1], c1[32][1]);
add1 fa1_31_0 (p[11][20], p[10][21], p[09][22], s1[31][0], c1[32][0]);
//index 31: p[08][23]

add1 fa1_30_5 (p[23][07], p[22][08], p[21][09], s1[30][5], c1[31][5]);
add1 fa1_30_4 (p[20][10], p[19][11], p[18][12], s1[30][4], c1[31][4]);
add1 fa1_30_3 (p[17][13], p[16][14], p[15][15], s1[30][3], c1[31][3]);
add1 fa1_30_2 (p[14][16], p[13][17], p[12][18], s1[30][2], c1[31][2]);
add1 fa1_30_1 (p[11][19], p[10][20], p[09][21], s1[30][1], c1[31][1]);
add1 fa1_30_0 (p[08][22], p[07][23], zero     , s1[30][0], c1[31][0]);

add1 fa1_29_5 (p[23][06], p[22][07], p[21][08], s1[29][5], c1[30][5]);
add1 fa1_29_4 (p[20][09], p[19][10], p[18][11], s1[29][4], c1[30][4]);
add1 fa1_29_3 (p[17][12], p[16][13], p[15][14], s1[29][3], c1[30][3]);
add1 fa1_29_2 (p[14][15], p[13][16], p[12][17], s1[29][2], c1[30][2]);
add1 fa1_29_1 (p[11][18], p[10][19], p[09][20], s1[29][1], c1[30][1]);
add1 fa1_29_0 (p[08][21], p[07][22], p[06][23], s1[29][0], c1[30][0]);

add1 fa1_28_5 (p[23][05], p[22][06], p[21][07], s1[28][5], c1[29][5]);
add1 fa1_28_4 (p[20][08], p[19][09], p[18][10], s1[28][4], c1[29][4]);
add1 fa1_28_3 (p[17][11], p[16][12], p[15][13], s1[28][3], c1[29][3]);
add1 fa1_28_2 (p[14][14], p[13][15], p[12][16], s1[28][2], c1[29][2]);
add1 fa1_28_1 (p[11][17], p[10][18], p[09][19], s1[28][1], c1[29][1]);
add1 fa1_28_0 (p[08][20], p[07][21], p[06][22], s1[28][0], c1[29][0]);
//index 28: p[5][23]




endmodule